home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / GE_VSRC.ZIP / V0.ASM < prev    next >
Assembly Source File  |  1995-04-15  |  9KB  |  361 lines

  1. ;The main code stuff.
  2. ;Following is a simple bit of stuff you can do with these lil
  3. ;routines.  The object (cube or 24-gon) moves closer to the eye,
  4. ;and rotates. 
  5. ;While this example is not entirely impressive, it does show you
  6. ;a few possibilities, and how to call everything.
  7.  
  8.         .386p
  9. code32  segment para public use32
  10.         assume cs:code32, ds:code32
  11.  
  12. include pmode.inc                     ;Pmode header
  13. include modex.inc                     ;ModeX code 
  14. include vec.inc                       ;Vector stuff.
  15. include vrt.inc                       ;tran's retrace stuff.
  16. include poly.inc                      ;polygon stuff.
  17.  
  18. ideal
  19. ;include 'cube.inc'                   ;pick 1 or the other. :)
  20. include '24gon.inc'
  21.  
  22. align 4                               ;keep it fast
  23. Matrix dd 10000h,0,0,0                ;Rotation Matrix
  24.        dd 0,10000h,0,0
  25.        dd 0,0,10000h,0
  26.        dd 0,0,0,10000h
  27.  
  28. XYPointList dw NUM_PTS*2 dup (0)      ;List of screen coords.
  29.  
  30. label NormalIndex word                ;indexes to normals for sort 
  31. i=0
  32. REPT NUM_PLANES
  33.     dw i
  34.     i=i+1
  35. ENDM
  36.  
  37. Theta dw 0                            ;XY rotate angle
  38. Phi dw 0                              ;Z  rotate angle
  39. Rho dd 2300000h                       ;Z Xlate
  40. EndPtList dw 200 dup (0,0)
  41.  
  42. ViewPoint dd 0h,0h,-10000h            ;Spot is towards increasing Z.
  43.  
  44. Normals dd NUM_PLANES*3 dup (0)       ;Rotated normals
  45.  
  46. VOffs dw 0                            ;video offset.
  47. YMin dw 0                             ;used for determining the
  48. DeltaY dw 0                           ;amount of buffer we actually need.
  49.  
  50. PlaneCol db 0
  51.  
  52. pal db 9,4,9                          ;red palette (purple bkg ! :))
  53.     i=16
  54. REPT 16
  55.         db i,0,0
  56.     i=i+3
  57. ENDM 
  58.         db 63,0,0
  59.             
  60. public _main
  61. _main:
  62.     sti                               ;enable interrupts.
  63.     
  64.     call _setmodex
  65.  
  66.  
  67.     call _vrt_init
  68.  
  69.     mov [dword _vrt_palptr],offset pal
  70.     mov [byte _vrt_palindex],0
  71.     mov [word _vrt_pallen],18        ;set pallette in retrace
  72.  
  73. framez:
  74.     mov esi,offset Matrix
  75.     mov ax,[Theta]
  76.     mov bx,[Phi]
  77.     mov ecx,[Rho]
  78.     call _CreateRotateMatrix          ;make new matrix
  79.  
  80.     mov ebx,offset Matrix
  81.     mov esi,offset XYZPointList
  82.     mov edi,offset XYPointList
  83.     mov cx,NUM_PTS
  84.     call _XformPts                    ;multiply and project
  85.  
  86.     mov ebx,offset Matrix
  87.     mov esi,offset NormalList
  88.     mov edi,offset Normals
  89.     mov cx,NUM_PLANES
  90.     call RotateNormals
  91.  
  92.  
  93.     mov esi,offset XYPointList+2      ;get the ymin thing.
  94.     mov cx,NUM_PTS
  95.     call GetYMin
  96.  
  97.     mov cx,NUM_PLANES
  98.     mov esi,offset Normals
  99.     mov ebx,offset NormalIndex
  100.     call Sort                         ;depth sort them.
  101.  
  102.     mov cx,NUM_PLANES
  103.     mov ebx,offset NormalIndex
  104.     
  105. allplanes:
  106.     push cx ebx
  107.     movzx ebx,[word ebx]              ;next normal
  108.     push bx                           ;save it for plane index 
  109.     lea ebx,[ebx+ebx*2]
  110.     lea ebx,[ebx*4+offset Normals]    ;12*Index+normals
  111.     cmp [dword ebx+2*4],0             ;is it visible?
  112.     jge nodraw
  113.     mov esi,offset ViewPoint
  114.     mov [PlaneCol],1
  115.     call _DotProduct                  ;get a color
  116.     js noadd                          ;make sure it's at least red.
  117.     shr ecx,12
  118.     add [PlaneCol],cl
  119. noadd:
  120.     
  121.     mov ecx,200*2                     ;clear linelist
  122.     or ax,-1
  123.     mov edi,offset EndPtList
  124.     rep stosw
  125.  
  126.     pop bx
  127.     sub sp,2                          ;for the early out..
  128.     mov ax,PLANE_LENGTH
  129.     mul bx
  130.     movzx esi,ax
  131.     add esi,offset plane1
  132.     call DrawPoly
  133. nodraw:
  134.     add sp,2                          ;leftover pop
  135.     pop ebx cx
  136.     add ebx,2
  137.     dec cx
  138.     jnz allplanes
  139.  
  140.     mov di,[Voffs]                    ;change and prep for erase old
  141.     call setpage                      ;page
  142.  
  143.     xor di,16000                      
  144.     mov [Voffs],di    
  145.  
  146.     and edi,0ffffh                    ;blank the old screen.
  147.     add edi,0a0000h
  148.     sub edi,[_code32a]
  149.     
  150.     mov dx,3c4h
  151.     mov ax,0f02h
  152.     out dx,ax    
  153.  
  154.     mov ecx,16000/2
  155.     xor ax,ax
  156.     rep stosw
  157.  
  158.     mov eax,[_vrt_timer]              ;make this the same speed on
  159.     mov [_vrt_timer],0                ;those new-fangled 386dx+'s :)
  160.     mov cx,ax
  161.     shl ax,2
  162.     add [word Theta],ax               ;~12 degrees XY on my 386sx16
  163.     shl cx,1                          
  164.     add [word Phi],cx                 ;6 degrees Z
  165.  
  166.     cmp [dword Rho],250000h
  167. ;   cmp [dword Rho],190000h           ;for closer-ups, uncomment! :)
  168.     jbe hitmax
  169.     sub [dword Rho],50000h
  170. hitmax:
  171.     mov bx,[gs:041ah]                 ;check keyboard buffer
  172.     cmp bx,[gs:041ch]
  173.     jz framez
  174.     mov [gs:041ch],bx                 ;clear buffer
  175.     call _vrt_uninit
  176.     mov [v86r_ax],3                   ;back 2 dos.
  177.     mov al,10h
  178.     int 33h
  179.     jmp _exit   
  180.  
  181. ;Draw the 4 pt plane.
  182. proc DrawPoly
  183.     mov bp,[YMin]                     ;setup miny for scan convert.
  184.     mov cx,PTS_PER_PLANE
  185. first3:
  186.     push cx
  187.     push esi
  188.     movzx esi,[word esi]
  189.     lea esi,[offset XYPointList+esi*4]
  190.     mov ax,[esi]
  191.     mov bx,[esi+2]
  192.     pop esi
  193.     push esi
  194.     movzx esi,[word esi+2]
  195.     lea esi,[offset XYPointList+esi*4]
  196.     mov cx,[esi]
  197.     mov dx,[esi+2]
  198.     mov edi,offset EndPtList
  199.     push bp
  200.     call _ScanEdge                    ;scan convert the dealy.
  201.     pop bp
  202.     pop esi
  203.     add esi,2
  204.     pop cx
  205.     dec cx
  206.     jnz first3
  207.     mov cx,200
  208.     mov dl,[PlaneCol]
  209.     mov esi,offset EndPtList
  210.     mov di,[Voffs]
  211.     call _DrawLineList
  212.     ret
  213. endp
  214.  
  215. proc setpage
  216.     mov bx,di                         ;flip page
  217.     mov dx,3d4h
  218.     mov al,0ch
  219.     mov ah,bh
  220.     out dx,ax
  221.     inc al
  222.     mov ah,bl
  223.     out dx,ax
  224.     mov eax,[_vrt_timer]              ;wait for retrace
  225. waitvr:
  226.     cmp eax,[_vrt_timer]
  227.     jz waitvr
  228.     ret
  229. endp
  230.  
  231. proc Sort
  232. ;depth sorts normals so we can draw em in order.
  233. ;entry: Esi = normal list.
  234. ;       Ebx = table of indexes to change.
  235. ;        cx = length.
  236.     add esi,8                         ;offset for Z-normal
  237. nextpass:
  238.     movzx edi,[word ebx]              ;get the first z normal val.
  239.     lea edi,[edi+edi*2]                 
  240.     mov eax,[edi*4+esi]                 
  241.     
  242.     xor ebp,ebp
  243.     push cx
  244.     dec cx
  245.     push ebx
  246.     add ebx,2                         ;prep for next index
  247. findmin:
  248.     movzx edi,[word ebx]              ;get the index
  249.     lea edi,[edi+edi*2]               ;edi*3
  250.     cmp eax,[edi*4+esi]               ;edi*12+esi
  251.     jge notless
  252.     mov ebp,ebx                       ;save the offset of the index
  253.     mov eax,[edi*4+esi]               ;get the value.
  254. notless:
  255.     add ebx,2                         ;next index
  256.     dec cx
  257.     jnz findmin
  258.     or ebp,ebp                        ;did we swap anything?
  259.     pop ebx 
  260.     jz noswap
  261.     mov ax,[word ebx]                 ;get old index
  262.     xchg ax,[word ebp]                ;switch it
  263.     mov [word ebx],ax
  264. noswap:
  265.     add ebx,2
  266.     pop cx
  267.     dec cx
  268.     cmp cx,1
  269.     jnz nextpass
  270.     ret 
  271. endp    
  272.  
  273. ;Get minimum Y value
  274. proc GetYMin
  275.     mov ax,[esi]
  276.     mov bx,[esi]
  277.     add esi,4
  278.     dec cx
  279. ym0:    
  280.     cmp ax,[esi]
  281.     jb notamin                        ;these should all be positive
  282.     mov ax,[esi]                      ;so screw the signed jmp
  283. notmax: 
  284.     add esi,4
  285.     dec cx
  286.     jnz ym0
  287.     sub bx,ax
  288.     mov [Ymin],ax
  289.     mov [DeltaY],bx
  290.     ret
  291. notamin:
  292.     cmp bx,[esi]
  293.     ja notmax
  294.     mov bx,[esi]
  295.     jmp notmax
  296. endp
  297.  
  298.  
  299. XTemp dd ?
  300. YTemp dd ?
  301. ZTemp dd ?
  302.  
  303. RotateNormals:
  304. ;ripped straight from the same code in vec.asm.  I didn't
  305. ;feel like writing any self-modifying code. :)
  306.     push cx
  307.     lodsd                             
  308.     mov [XTemp],eax                    
  309.     imul [dword ebx]                  
  310.     shrd eax,edx,16
  311.     mov ecx,eax                       
  312.     lodsd
  313.     mov [YTemp],eax
  314.     imul [dword ebx+4*4]
  315.     shrd eax,edx,16
  316.     add ecx,eax
  317.     lodsd
  318.     mov [ZTemp],eax
  319.     imul [dword ebx+8*4]
  320.     shrd eax,edx,16
  321.     add ecx,eax
  322.     mov [edi],ecx
  323.     add edi,4    
  324.  
  325.     mov eax,[XTemp]                   ;calc NewY
  326.     imul [dword ebx+1*4]                          
  327.     shrd eax,edx,16
  328.     mov ecx,eax                       
  329.     mov eax,[YTemp]
  330.     imul [dword ebx+5*4]
  331.     shrd eax,edx,16
  332.     add ecx,eax
  333.     mov eax,[ZTemp]
  334.     imul [dword ebx+9*4]
  335.     shrd eax,edx,16
  336.     add ecx,eax
  337.     mov [edi],ecx
  338.     add edi,4
  339.     
  340.     mov eax,[XTemp]                   ;calc NewZ
  341.     imul [dword ebx+2*4]                          
  342.     shrd eax,edx,16
  343.     mov ecx,eax                       
  344.     mov eax,[YTemp]
  345.     imul [dword ebx+6*4]
  346.     shrd eax,edx,16
  347.     add ecx,eax
  348.     mov eax,[ZTemp]
  349.     imul [dword ebx+10*4]
  350.     shrd eax,edx,16
  351.     add ecx,eax
  352.     mov [edi],ecx
  353.     add edi,4
  354.     pop cx
  355.     dec cx
  356.     jnz RotateNormals
  357.     ret
  358.  
  359. ends
  360. end
  361.